iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0
自我挑戰組

從 AWS 菜鳥敲敲雲端的大門系列 第 18

Day 11 - SQS 任務暫存器

  • 分享至 

  • xImage
  •  

SQS

Simple Queue Service,是 AWS 提供的訊息佇列服務。

SQS 可以搭配其他 AWS 服務。讓分散式處理的應用程式更具擴充性。

可以 用來解除系統與系統之間的偶合程度

實際應用在影片轉檔這類需要大量運算、計算量較大的工作,會花上一些時間。

總不可能要 User 一直等在那邊等待伺服器回復吧?

因此可以考慮把架構調整成 Producer 和 Consumer 這類的架構。

角色

主要會有幾個重要的角色:

  • Producer
    • 負責將使用者個請求轉換為 Message,並將 Message 送入 Queue
  • Queue
    • 負責存放 Message 的服務,等待 Consumer 完成
  • Consumer
    • 從 Queue 裡面抽取 Message,通常執行需要高負荷的工作

AWS-SQS.drawio

Producer 生產的 Message,預設最大值為 256 KB 。如果檔案可能超過這個大小,建議將檔案放到 S3,然後再由 Consumer 去 S3 拉取檔案。

Standard & FIFO

依照不同情境,SQS 有兩種不同的版本。

Standard Queue 提供最高輸送量、盡力提供最佳排序,以及至少交付一次,但是有可能超過一筆紀錄

FIFO (First In First Out) Queue 的設計目的是要保證訊息只會完全依照它們的傳送順序不會有重複的訊息送至佇列

差異及特性如下表:

Standard Queue FIFO (First In First Out) Queue
每秒近乎無限個交易數 (TPS) 每秒 300 個訊息 (包括傳送、接收或刪除)每個操作可以操作最大值 10 則訊息。最多可支援 3000 則訊息。
至少傳遞一次,但是有可能重複傳遞 剛好只會傳遞一次
不保證順序性 保證順序性

總結一下,如果考量到時間的順序性,且不希望額外處理應用程式的等冪性,可以選擇 FIFO 版本

等冪性 (相同訊息處理一次以上不會有不良影響)

任務重複處理

一個 Queue,是可以容許多個 Consumer 去 Pull 訊息的。但是如果剛好多個 Consumer 去 Pull 同一筆 訊息進行處理的話。後續的處理就有可能導致資料重複或不正確。例如有一個 Queue 是專門處理發票開立,實際狀況是不能讓發票被計算兩次的。

因此 SQS 為了避免訊息重複處理,增加了 Invisibility 訊息不可見 的處理,當第一個 Consumer Pull 訊息後,被 Pull 的訊息就會暫時隱藏,讓其他 Consumer 無法 Pull。

訊息不可見也有 Timeout 時間,下限為 0 ,上限為 12 小時,預設為 30 秒。

記得!! 當 Consumer 完成訊息的任務以後,記得 Delete Message,這樣 SQS 會把暫時隱藏的消息完全刪除掉,減少之後訊息重用的情況發生。

保留時間

放在 Queue 裡面的訊息,都有保留時間, 預設保留時間為 4 天 。當保留時間一到,SQS 會自動刪除該訊息。

可以設定 保留時間最小為 60 秒,最大為 14 天

長輪詢 & 短輪詢

由於 Amazon SQS 是分散式系統,因此有可能會回應空白的請求。

因此會需要搭配以下兩種方法擇一去接收訊息:

  • 短輪詢,請求僅會查詢伺服器的子集 (按照加權隨機分佈) 來查找可包含在回應中的訊息。即使查詢未找到任何消息,SQS 也會立即發送空回應, 訪問次數多
  • 長輪詢,請求查詢所有服務器的消息。SQS 會在收集到至少一個可用訊息 (最多到請求中指定的最大訊息數目) 之後傳送回應。僅當輪詢等待時間過期時,Amazon SQS 才會發送空回應, 訪問次數少

成本計算

依據存取次數的數量來決定價格。

Short Polling 短輪詢,訪問次數多;Long Polling 長輪詢,訪問次數少。

訪問次數多相對的存取次數就多,成本也就越高。

參考資料


上一篇
Day 10 - Auto Scaling 自動增減機器
下一篇
Day 12 - DynamoDB NoSQL 解決方案
系列文
從 AWS 菜鳥敲敲雲端的大門37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言